home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
mymathtrans.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
11KB
|
448 lines
IMPLEMENTATION MODULE MyMathTrans;
(*
Created: 29.8.87 by
Changed: 25.1.88/18.02.88/4.8.88/25.8.88/29.9.88
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
*)
FROM SYSTEM IMPORT FFP;
FROM MyMathLibLong IMPORT errorNumber,unit,AngleUnit;
FROM MathTrans IMPORT Acos,Asin,Atan,Cos,Cosh,Exp,Log,Log10,Pow,
Sin,Sinh,Sqrt,Tan,Tanh,Fieee;
CONST
MaxFFP=MAX(FFP);
TwoPi=6.2831853;
DegToRad=TwoPi/360.0;
GonToRad=TwoPi/400.0;
RadToDeg=360.0/TwoPi;
RadToGon=400.0/TwoPi;
(****************************************************************************)
PROCEDURE MyUnit(w:FFP):FFP;
(* rechnet Winkel in Grad oder Neugrad in Radiant um, wenn unit # rad *)
BEGIN
IF unit=deg THEN
RETURN w*DegToRad
ELSIF unit=gon THEN
RETURN w*GonToRad
ELSE
RETURN w
END
END MyUnit;
(****************************************************************************)
PROCEDURE YourUnit(w:FFP):FFP;
(* Rechnet Resultate von rad in die durch unit bestimmte Einheit um *)
BEGIN
IF unit=deg THEN
RETURN w*RadToDeg
ELSIF unit=gon THEN
RETURN w*RadToGon
ELSE
RETURN w
END
END YourUnit;
(****************************************************************************)
PROCEDURE NeutraleFunc(x:FFP):FFP;
BEGIN
(*errorNumber:=0;*)
RETURN x
END NeutraleFunc;
(****************************************************************************)
PROCEDURE Abs(x:FFP):FFP;
BEGIN
(*errorNumber:=0;*)
RETURN ABS(x)
END Abs;
(****************************************************************************)
PROCEDURE Fac(x:FFP):FFP;
(* Facultaet fuer ganze Zahlen 0 <= n <= 19 *)
VAR
j:[0..20];
intx:INTEGER;
z:FFP;
zuklein,zugross,istganz:BOOLEAN;
BEGIN
zugross:=x>19.0;
zuklein:=x<0.0;
IF (NOT zuklein) AND (NOT zugross) THEN
intx:=INTEGER(x);
istganz:=(x=FFP(intx));
IF istganz THEN
(*errorNumber:=0;*)
z:=1.0;
FOR j:=2 TO intx DO
z:=z * FFP(j)
END;
RETURN z
ELSE
errorNumber:=77;
RETURN 0.0
END
ELSIF zugross THEN
errorNumber:=51;
RETURN MaxFFP
ELSE
errorNumber:=76;
RETURN 0.0
END
END Fac;
(****************************************************************************)
PROCEDURE Sqr(x:FFP):FFP;
(* Quadrat *)
BEGIN
IF (x<= 1.0E9) THEN
(*errorNumber:=0;*)
RETURN x*x;
ELSE
errorNumber:=52;
RETURN MaxFFP
END
END Sqr;
(****************************************************************************)
PROCEDURE Power(x,y:FFP):FFP;
(*Raise x to the y th power x^y *)
CONST
Epsilon=1.0E-6;
VAR inty:INTEGER;
j:CARDINAL;
z:FFP;
expNegativ,ok:BOOLEAN;
BEGIN
(*errorNumber:=0;*)
ok:=(ABS(y)<10.0) AND (x<=60.0);
IF ok THEN
IF y<0.0 THEN (* runden*)
inty:=INTEGER(y-0.5)
ELSE
inty:=INTEGER(y+0.5)
END;
END;
IF ok AND (ABS(y-FFP(inty))<Epsilon) THEN
expNegativ:=(inty<0);
inty:=ABS(inty);
z:=x;
x:=1.0;
FOR j:=1 TO inty DO
x:=x*z
END;
IF expNegativ THEN
IF x=0.0 THEN
errorNumber:=3
ELSE
x:=1.0/x;
END
END
ELSIF y=0.0 THEN
x:=1.0
ELSE
IF x>0.0 THEN
x:=Exp(y*Log(x));
ELSE
x:=0.0;
errorNumber:=4
END
END;
RETURN x
END Power;
(****************************************************************************)
PROCEDURE SIN(x:FFP):FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
(*errorNumber:=0;*)
RETURN Sin(x)
ELSE
errorNumber:=18;
RETURN 0.0
END;
END SIN;
(****************************************************************************)
PROCEDURE COS(x:FFP):FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
(*errorNumber:=0;*)
RETURN Cos(x)
ELSE
errorNumber:=18;
RETURN 0.0
END
END COS;
(****************************************************************************)
PROCEDURE TAN(x:FFP):FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
IF Cos(x)=0.0 THEN
errorNumber:=5;
RETURN MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN Tan(x)
END
ELSE
errorNumber:=18;
RETURN 0.0
END
END TAN;
(****************************************************************************)
PROCEDURE Arctan(x:FFP):FFP;
BEGIN
RETURN YourUnit(Atan(x))
END Arctan;
(****************************************************************************)
PROCEDURE Cot(x:FFP):FFP;
(* Kotangens *)
VAR z:FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
z:=Cos(PiHalbe-x);
IF z=0.0 THEN
errorNumber:=6;
RETURN MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN Sin(PiHalbe-x)/z
END
ELSE
errorNumber:=18;
RETURN 0.0
END
END Cot;
(****************************************************************************)
PROCEDURE Sec(x:FFP):FFP;
(*Sekans = 1/cos(x) *)
VAR y:FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
y:=Cos(x);
IF y=0.0 THEN
errorNumber:=7;
RETURN MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN 1.0/y
END
ELSE
errorNumber:=18;
RETURN 0.0
END
END Sec;
(****************************************************************************)
PROCEDURE Cosec(x:FFP):FFP;
(* Kosekans =1/sin(x) *)
VAR y:FFP;
BEGIN
x:=MyUnit(x);
IF ABS(x) < 1.0E8 THEN
y:=Sin(x);
IF y=0.0 THEN
errorNumber:=8;
RETURN MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN 1.0/Sin(x)
END
ELSE
errorNumber:=18;
RETURN 0.0
END
END Cosec;
(****************************************************************************)
PROCEDURE Arcsin(x:FFP):FFP;
(* ArcusSinus= Umkehrfunktion des Sinus -1<= x <= +1 *)
BEGIN
IF ABS(x)<=1.0 THEN
(*errorNumber:=0;*)
RETURN YourUnit(Asin(x))
ELSE
errorNumber:=9;
RETURN 0.0
END
END Arcsin;
(****************************************************************************)
PROCEDURE Arccos(x:FFP):FFP;
(* ArcusCosinus = Umkehrfunktion des Cosinus -1 <=x <= +1 *)
BEGIN
IF ABS(x)<=1.0 THEN
(*errorNumber:=0;*)
RETURN YourUnit(Acos(x))
ELSE
errorNumber:=10;
RETURN 0.0
END
END Arccos;
(****************************************************************************)
PROCEDURE Arccot(x:FFP):FFP;
(* ArcusKotangens = Umkehrfunktion des Kotangens *)
BEGIN
(*errorNumber:=0;*)
RETURN YourUnit(PiHalbe-Atan(x))
END Arccot;
(****************************************************************************)
PROCEDURE EXP(x:FFP):FFP;
BEGIN
IF ABS(x)< 42.0 THEN
(*errorNumber:=0;*)
RETURN Exp(x)
ELSE errorNumber:=11;
RETURN 0.0
END
END EXP;
(****************************************************************************)
PROCEDURE Ln(x:FFP):FFP;
(* Natuerlicher Logarithnus*)
BEGIN
IF x>0.0 THEN
(*errorNumber:=0;*)
RETURN Log(x)
ELSE
errorNumber:=12;
RETURN 0.0
END
END Ln;
(*****************************************************************************)
PROCEDURE LOG(x:FFP):FFP;
(*Logarithmus zur Basis 10*)
BEGIN
IF x>0.0 THEN
(*errorNumber:=0;*)
RETURN Log10(x)
ELSE errorNumber:=13;
RETURN 0.0
END
END LOG;
(****************************************************************************)
PROCEDURE SINH(x:FFP):FFP;
(* Sinus Hyperbolicus bzw. HyperbelSinus *)
BEGIN
IF x>42.0 THEN
errorNumber:=54;
RETURN MaxFFP
ELSIF x<-42.0 THEN
errorNumber:=54;
RETURN -MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN Sinh(x)
END
END SINH;
(****************************************************************************)
PROCEDURE COSH(x:FFP):FFP;
(* Cosinus Hyperbolicus bzw. HyperbelCosinus *)
BEGIN
IF ABS(x)>42.0 THEN
errorNumber:=54;
RETURN MaxFFP
ELSE
(*errorNumber:=0;*)
RETURN Cosh(x)
END
END COSH;
(****************************************************************************)
PROCEDURE TANH(x:FFP):FFP;
(* Tangens Hyperbolicus bzw. HyperbelTangens *)
BEGIN
(*errorNumber:=0;*)
RETURN Tanh(x)
END TANH;
(****************************************************************************)
PROCEDURE Coth(x:FFP):FFP;
(* Cotanges Hyperbolicus bzw. HyperbelCotangens *)
VAR y,y1:FFP;
BEGIN
IF x#0.0 THEN
(*errorNumber:=0;*)
y:=Exp(x);
y1:=1.0/y;
RETURN (y+y1)/(y-y1)
ELSE
errorNumber:=14;
RETURN 0.0
END
END Coth;
(****************************************************************************)
PROCEDURE Arsinh(x:FFP):FFP;
(* AreaSinus = Umkehrfunktion von sinh(x) *)
VAR y:FFP;
BEGIN
(*errorNumber:=0;*)
y:=Log(x+Sqrt(x*x+1.0));
RETURN y
END Arsinh;
(****************************************************************************)
PROCEDURE Arcosh(x:FFP):FFP;
(* AreaCosinus = Umkehrfunktion von cosh(x) *)
VAR y:FFP;
BEGIN
IF x>=1.0 THEN
(*errorNumber:=0;*)
y:=Log(x+Sqrt(x*x-1.0));
RETURN y
ELSE
errorNumber:=15;
RETURN 0.0
END
END Arcosh;
(****************************************************************************)
PROCEDURE Artanh(x:FFP):FFP;
(* AreaTangens = Umkehrfunktion tanh(x) *)
VAR y:FFP;
BEGIN
IF ABS(x)<1.0 THEN
(*errorNumber:=0;*)
y:=0.5*Ln((1.0+x)/(1.0-x));
RETURN y
ELSE
errorNumber:=16;
RETURN 0.0
END
END Artanh;
(****************************************************************************)
PROCEDURE SQRT(x:FFP):FFP;
BEGIN
IF x>=0.0 THEN
(*errorNumber:=0;*)
RETURN Sqrt(x)
ELSE
errorNumber:=17;
RETURN 0.0
END
END SQRT;
(****************************************************************************)
PROCEDURE Arcoth(x:FFP):FFP;
BEGIN
IF ABS(x)>1.0 THEN
(*errorNumber:=0;*)
RETURN 0.5*Log((x+1.0)/(x-1.0))
ELSE
errorNumber:=19;
RETURN 0.0
END
END Arcoth;
(****************************************************************************)
PROCEDURE Int(x:FFP):FFP;
BEGIN
IF ABS(x)<2147483648.0 THEN
(*errorNumber:=0;*)
RETURN FFP(LONGINT(x))
ELSE
errorNumber:=20;
RETURN 0.0
END
END Int;
BEGIN
unit:=rad;
errorNumber:=0
END MyMathTrans.mod